﻿using System;
using System.Collections.Generic;
using System.Text;
using PCDoctor.SQLite;
using System.Windows.Forms;
using System.Data.SQLite;
using System.Data;
using PCDoctor.ScanParameters;
using System.IO;
using PCDoctor.Settings;
using PCDoctor.Utils;
using PCDoctor.Updater;
using PCDoctor.Licensing;

namespace Module1
{
    class Program
    {
        static string ShowMenu()
        {
            Console.Clear();
            Console.WriteLine("Выберите пункт:");
            Console.WriteLine("0: Проверка производительности компьютера по всем параметрам");
            Console.WriteLine("1: Поиск проблем в производительности сети");
            Console.WriteLine("2: Поиск проблем в производительности файловой системы");
            Console.WriteLine("3: Поиск проблем в производительности ядра системы");
            Console.WriteLine("4: Проверка возможностей игровой оптимизации");
            Console.WriteLine("R: Восстановление изначальных параметров системы");
            Console.WriteLine("A: Включение/отключение автозагрузки программы");
            Console.Write("Ваш выбор (0-4, R, х): ");
            string inp = Console.ReadLine();
            return inp;
        }

        static void SetAutoload()
        {
            Console.Clear();
            Config.getInstance().ReloadAutoStart();
            string a_s = Config.getInstance().getValue(Config.APP_AUTOSTART);
            if (a_s == "Y")
            {
                Console.WriteLine("Автозагрузка приложения включена. Отключить (Y/N)?");
                string answer = Console.ReadLine();
                if (answer == "Y" || answer == "y")
                {
                    if (Config.getInstance().SetAutoStart(false))
                    {
                        Console.WriteLine("Операция успешно завершена, нажмите Enter для продолжения");
                    }
                    else
                    {
                        Console.WriteLine("Операция завершена с ошибками, нажмите Enter для продолжения");
                    }
                }
            }
            else
            {
                Console.WriteLine("Автозагрузка приложения отключена. Включить (Y/N)?");
                string answer = Console.ReadLine();
                if (answer == "Y" || answer == "y")
                {
                    if (Config.getInstance().SetAutoStart(true))
                    {
                        Console.WriteLine("Операция успешно завершена, нажмите Enter для продолжения");
                    }
                    else
                    {
                        Console.WriteLine("Операция завершена с ошибками, нажмите Enter для продолжения");
                    }
                }
            }
            Console.ReadLine();
        }

        static void MakeRestore()
        {
            Restorer rest = new Restorer();
            Console.WriteLine("Восстанавливаем системные параметры");
            rest.RestoreProgressed += new RestoreProgress(rest_RestoreProgressed);
            rest.RestoreAll();
            Console.WriteLine("Восстановление настроек системы завершено");
            Console.ReadLine();
        }

        static void doUpdate()
        {
            Console.WriteLine("Проверка наличия обновлений...");
            Updater u = new Updater();
            Config cfg = Config.getInstance();
            if (u.Check())
            {
                int res = u.CompareVersion(Config.CURRENT_VERSION);
                if (res > 0)
                {
                    Console.WriteLine("Найдено обновление, новая версия " +
                        u.newVersion);
                    if (cfg.getValue(Config.UPDATE_SKIP_VERSION) == u.newVersion)
                    {
                        Console.WriteLine("Установка обновления данной версии была отменена " +
                            "вами ранее");
                        Console.WriteLine("В конечной версии с GUI будет возможность установить " +
                            "это обновление, но табличка выскакивать не будет");
                    }
                    else
                    {
                        Console.WriteLine("Обновить ПО (Y/N)?");
                        string choice = Console.ReadLine();
                        if (choice == "y" || choice == "Y")
                        {
                            u.UpdateFinished += new UpdateFinish(u_UpdateFinished);
                            if (!u.Update())
                            {
                                Console.WriteLine("При обновлении произошли ошибки");
                                Console.WriteLine("Для продолжения нажмите Enter");
                            }
                        }
                        else
                        {
                            Console.WriteLine("Обновление до версии " + u.newVersion +
                                "отменено пользователем.\nО следующей версии вам будет сообщено");
                            Console.WriteLine("Для продолжения нажмите Enter");
                            cfg.setValue(Config.UPDATE_SKIP_VERSION, u.newVersion);
                            cfg.Save();
                        }
                    }
                }
                else
                {
                    Console.WriteLine("Обновление не требуется, текущая версия " +
                        Config.CURRENT_VERSION);
                    Console.WriteLine("Для продолжения нажмите Enter");
                }
            }
            else
            {
                Console.WriteLine("Не удалось проверить наличие обновлений");
                Console.WriteLine("Для продолжения нажмите Enter");
            }
            Console.ReadLine();
            Console.Clear();
        }

        static void u_UpdateFinished(object sender, UpdateFinishedEventArgs e)
        {
            Console.WriteLine("При обновлении произошла ошибка");
            Console.WriteLine("Для продолжения нажмите Enter");
        }

        static void doLicense()
        {
            LicenseWorker lw = new LicenseWorker();
            if (!lw.isRegistered)
            {
                Console.WriteLine("Программа не зарегистрирована (демо-режим)");
                Console.WriteLine("У вас есть лицензионный ключ (Y/N)?");
                string answer = Console.ReadLine();
                if (answer == "y" || answer == "Y")
                {
                    Console.WriteLine("Введите лицензионный ключ:");
                    string key = Console.ReadLine();
                    int reg = lw.RegisterProgram(key);
                    if (reg == 0)
                    {
                        Console.WriteLine("Регистрация прошла успешно");
                    }
                    else
                    {
                        if (reg < 0)
                        {
                            Console.WriteLine("Ошибка запроса к серверу активации");
                        }
                        else
                        {
                            Console.WriteLine("Неверно введен регистрационный ключ");
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("Программа зарегистрирована, доступен полный функционал");
            }
            Console.WriteLine("Нажмите Enter для продолжения");
            Console.ReadLine();
            Console.Clear();
        }

        static void Main(string[] args)
        {
            doLicense();
            doUpdate();
            LicenseWorker lw = LicenseWorker.getInstance();
            Console.WriteLine("Загрузка параметров конфигурации...");
            Config.getInstance().debug();
            Console.WriteLine("Нажмите Enter для перехода в основное меню");
            Console.ReadLine();
            ScanParameterFactory factory = new ScanParameterFactory();
            List<ScanParameter> parameters = null;
            string menuChoice;
            do {
                menuChoice = ShowMenu();
                string fixerQuestion = "\nИсправить проблемы? (Y/N) ";
                string quitPhrase = "\nНажмите Enter для продолжения";
                string optimizeComplete = "\n\nИсправление проблем завершено.";
                switch (menuChoice)
                {
                    case "0":
                        parameters = factory.getAllScanParameters();
                        break;
                    case "1":
                    case "2":
                    case "3":
                        parameters = factory.getScanParameters(int.Parse(menuChoice));
                        break;
                    case "4":
                        fixerQuestion = "\nВключить игровой режим? (Y/N) ";
                        optimizeComplete = "\n\nИгровой режим включен";
                        parameters = factory.getGamingParameters();
                        break;
                    case "R":
                    case "r":
                        MakeRestore();
                        parameters = null;
                        break;
                    case "A":
                    case "a":
                        SetAutoload();
                        parameters = null;
                        break;
                    default:
                        parameters = null;
                        break;
                }
                if (parameters != null)
                {
                    if (menuChoice == "4" && !lw.isRegistered)
                    {
                        Console.WriteLine("Игровой режим доступен только в зарегистрированной версии ПО!");
                        Console.WriteLine("Для продолжения нажмите Enter");
                        Console.ReadLine();
                    }
                    else
                    {
                        ProblemScanner scanner = new ProblemScanner();
                        scanner.ScanProgressed += new ScanPrgress(scanner_ScanProgressed);
                        Console.Clear();
                        Console.WriteLine("Выполняются выбранные действия:\n");
                        scanner.Scan(parameters);
                        Console.WriteLine("\nСканирование завершено. Найдено возможных оптимизаций: " +
                            scanner.TotalProblems.ToString());
                        Console.Write(fixerQuestion);
                        string answer = Console.ReadLine();
                        switch (answer.ToLower())
                        {
                            case "y":
                                if (!lw.isRegistered)
                                {
                                    Console.WriteLine("Программа не зарегистрирована, доступно только 5 оптимизаций");
                                }
                                ProblemSolver solver = new ProblemSolver();
                                solver.FixProgressed += new FixProgress(solver_FixProgressed);
                                Console.Clear();
                                if (menuChoice == "4")
                                {
                                    quitPhrase = "\nНажмите Enter для выхода из игрового режима";
                                }
                                Console.WriteLine("Исправление найденных проблем:\n");
                                if (lw.isRegistered)
                                {
                                    solver.Fix(parameters);
                                }
                                else
                                {
                                    solver.Fix(parameters.GetRange(0, 5));
                                }
                                Console.WriteLine(optimizeComplete);
                                break;
                        }
                        Console.WriteLine(quitPhrase);
                        Console.ReadLine();
                        if (menuChoice == "4")
                        {
                            Backuper b = new Backuper();
                            b.RestoreSystemDefaults(parameters);
                        }
                    }
                }
            } while (menuChoice != "x");
        }

        static void rest_RestoreProgressed(object sender, RestoreProgressEventArgs e)
        {
            Console.WriteLine("Восстановлено " + e.Progress.ToString() + "%");
        }

        static void solver_FixProgressed(object sender, FixProgressEventArgs e)
        {
            if (e.Result != FixationResult.NoNeedToFix)
            {
                Console.WriteLine(e.ProblemName + " исправлено " + e.FixedProblems +
                    " из " + e.ProblemsCount);
            }
        }

        static void g_scanner_ScanProgressed(object sender, ScanProgressEventArgs e)
        {
            Console.WriteLine(e.ProblemName + " " + e.Result.ToString());
        }

        static void scanner_ScanProgressed(object sender, ScanProgressEventArgs e)
        {
            if (e.Result == ScanResult.Problem || e.Result == ScanResult.SemiProblem)
            {
                Console.WriteLine(e.ProblemName + ", количество проблем: " + e.ProblemsCount.ToString());
            }
            if (e.Result == ScanResult.NotScanned)
            {
                Console.WriteLine("Не проверено - " + e.ProblemName);
            }
        }
    }
}
